package simple.number;

/**
 * <a href="https://leetcode-cn.com/problems/binary-number-with-alternating-bits/">693. 交替位二进制数</a>
 * 给定一个正整数，检查它的二进制表示是否总是 0、1 交替出现：换句话说，就是二进制表示中相邻两位的数字永不相同。
 * 示例 1：
 *   输入：n = 5
 *   输出：true
 *   解释：5 的二进制表示是：101
 * 示例 2：
 *   输入：n = 7
 *   输出：false
 *   解释：7 的二进制表示是：111.
 * 示例 3：
 *   输入：n = 11
 *   输出：false
 *   解释：11 的二进制表示是：1011.
 * 提示：
 *   1 <= n <= 2^31 - 1
 * @author 刘学松
 * @date 2021-03-24 12:23
 */
public class 交替位二进制数 {
    public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(1431655765));
        System.out.println(Integer.toBinaryString(-1431655766));
        System.out.println(1431655765&4);
        System.out.println(-1431655766&4);
    }

    public boolean hasAlternatingBits(int n) {
        int tail = n & 1;
        n = n >> 1;
        while (n != 0) {
            int t = n & 1;
            if (t == tail) {
                return false;
            } else {
                tail = t;
                n = n >> 1;
            }
        }
        return true;
    }
    public boolean hasAlternatingBits1(int n) {
        // 异或后全为1，那么a = 1111... a+1=10000...
        int a = n ^ (n >> 1);
        return (a & (a + 1)) == 0;
    }
}
